package spectra.ee.web.common.service;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.map.CaseInsensitiveMap;

import spectra.base.log.Logger;
import spectra.base.util.DateUtil;
import spectra.base.util.StringUtil;
import spectra.base.util.Util;
import spectra.ee.EEPublic;
import spectra.ee.commons.kb.model.KbSearchLog;
import spectra.ee.commons.kb.model.KbViewLog;
import spectra.ee.commons.qna.model.Qna;
import spectra.ee.commons.qna.model.QnaProcess;
import spectra.ee.web.common.model.IdListForm;
import spectra.ee.web.common.model.Option;
import spectra.ee.web.common.model.Survey;
import spectra.ee.web.common.model.SurveyResponse;
import spectra.ee.web.common.model.SurveyResponseForm;
import spectra.ee.web.kb.model.Kb;

public class SurveyWebService extends SurveyServiceBase
{
	/** Logger객체. */
	private static Logger logger = Logger.getLoggerInstance(SurveyWebService.class.getName());
	
	public List selectSurveyListByCondition(Survey survey)
	{
		//설문 아이템까지한번에 합쳐서 보내야한다.
		List lstSurvey = selectSurveyListByCondition(survey.getDomainId(), survey.getNodeId(), survey.getServiceType(), survey.getSurveyType(), survey.getQnaId());
		
		//from_valid_date=00000000000000, title=[FAQ]조회 후 시스템 기본 설문, 
		//hidden_flag=N, use_flag=Y, essential_flag=Y, answer_type=RADIO, 
		//codeset_id=CSET0000000001, question_title=FAQ 용 만족도, updated_date=20110807082147, 
		//survey_item_id=ITEM0000000010, to_valid_date=99999999999999, updated_by=admin, 
		//delete_flag=N, answer_list=null, survey_id=SURV0000000010, text_size=0, sort_order=0, service_type=SVFAQ, 
		//codeset_type=TYFDK, survey_type=FAQAF, input_type=CODES, init_value=null, description=만족도코드를 포함한 FAQ 용 조회후 설문 - 시스템 설문, 
		//domain_id=NODE0000000001, created_date=20110719075701, created_by=admin, mapping_id=MAPPINGNOTHING}
		
		//모든 설문 코드 리스트를 가져온다.
		try
		{
			if(lstSurvey != null && lstSurvey.size() > 0)
			{
				Map mapSurvey = null;
				String codesetId = null;
				String[] arrCodesetId =  new String[lstSurvey.size()];
				int i = 0;
				for (Iterator it = lstSurvey.iterator(); it.hasNext();)
				{
					mapSurvey = (Map)it.next();
					codesetId = (String)mapSurvey.get("codeset_id");
					arrCodesetId[i++] = codesetId;
				}
				
				Map mapCode = null;
				IdListForm idListForm = new IdListForm();
				idListForm.setRowIdList(arrCodesetId);
				List lstCode = (List) sqlMap.queryForList("Survey.selectSurveyCodeListByCodesetIds", idListForm);
				// codesetId
				//임시로 담아둘 맵과 리스트
				Map mapTemp = new HashMap();
				String preCodesetId = "";
				List lstTemp = null;
				for (Iterator itCode = lstCode.iterator();itCode.hasNext();)
				{
					mapCode = (Map)itCode.next();
					codesetId = (String)mapCode.get("codeset_id");
					
					//변경되었으면 이전 리스트는 map 에 담아놓고 새 List에 담는다.
					if (!preCodesetId.equals(codesetId))
					{
						if (lstTemp != null)
						{
							mapTemp.put(preCodesetId, lstTemp);
						}
						lstTemp = new ArrayList();
					}
					lstTemp.add(mapCode);
					preCodesetId = codesetId;
				}
				mapTemp.put(preCodesetId, lstTemp);
				
				for (Iterator it = lstSurvey.iterator(); it.hasNext();)
				{
					mapSurvey = (Map)it.next();
					
					codesetId = (String)mapSurvey.get("codeset_id");
					mapSurvey.put("code_list", mapTemp.get(codesetId));
					
					// MAPPING 정보 가져오기
		            List surveyMapping = selectSurveyMappingInfo((String) mapSurvey.get("MAPPING_ID"));
		            if (surveyMapping != null && surveyMapping.size() > 0)
		            {           
		            	CaseInsensitiveMap mapMapping = (CaseInsensitiveMap) surveyMapping.get(0);
		            	mapSurvey.put("mapping_type", mapMapping.get("MAPPING_TYPE"));
		            	mapSurvey.put("target_table", mapMapping.get("TARGET_TABLE"));
		            	mapSurvey.put("target_field", mapMapping.get("TARGET_FIELD"));
		            }
				}
			}
		} 
		catch (SQLException e)
		{
			logger.error(e.getMessage());
			e.printStackTrace();
		}
		return lstSurvey;
	}
	
	/**
	 * 1. 이미 한 설문인지 확인 (todo) - 강제 업데이트 할지 여부를 파라메터로 받아야 함.
	 * 2. t_survey_response 에 입력 - 필수 입력값의 값이 없는지 확인
	 * 3. codeset_type 에 따라 처리
	 * 4. mapping 정보에 따라 처리
	 */
	public boolean insertSurveyResponse(SurveyResponse surveyResponse)
    {
		boolean bSuccess = false;
		surveyResponse.setCreatedDate(DateUtil.getCurrDateTimeStamp());
        try
        {
        	if (surveyResponse.getServiceType().equals(EEPublic.SERVICE_TYPE_QNA))
        	{
        		// TODO : 이미 응답했는지 여부를 리턴해야 함.
        	}
        	//이미 응답이 있으면 에러 없으면 insert
        	Integer iRet = (Integer) sqlMap.queryForObject("Survey.selectCountByTargetId", surveyResponse);
        	sqlMap.startTransaction();
        	if (iRet.intValue() > 0) 
            {
            	//응답이 이미 있음
            }
            else
            {
            	//t_survey_response 에 입력
            	sqlMap.insert("Survey.insertServeyResponse", surveyResponse);	
            }
            //codeset_type 에 따라 처리
            
        	
            sqlMap.commitTransaction();
            
            bSuccess = true;
        }
        catch(Exception e)
        {
            logger.error(e.getMessage());
            e.printStackTrace();
        }
        finally
        {
            try
            {
                sqlMap.endTransaction();
            }
            catch(SQLException e)
            {
                logger.error(e.getMessage());
                e.printStackTrace();
            }
        }
        return bSuccess;
    }
	
	/**
	 * 설문지에 해당하는 모든 응답 결과를 기록한다.
	 * 요청은 하나의 설문지(target_id) 에서 들어온것으로 가정한다. target_id 가 서로 다른 경우는 에러
	 * @param SurveyResponseListForm
	 * @return
	 */
	public boolean insertSurveyResponseList(ArrayList surveyResponseList)
    {
		//간단한 데이터 검증
		//1. 입력할 데이터가 없다.
		if (surveyResponseList == null || surveyResponseList.size() == 0) return false;
		SurveyResponse surveyResponse = (SurveyResponse)surveyResponseList.get(0);
		//2. target_id 는 모두 같아야함.
		String targetId = surveyResponse.getTargetId();
		String serviceType = surveyResponse.getServiceType();
		String surveyType = surveyResponse.getSurveyType();
		int processSeq = surveyResponse.getProcessSeq();
		int iResponseCount = surveyResponseList.size();

		String createdDate = DateUtil.getCurrDateTimeStamp();
		for (Iterator it = surveyResponseList.iterator(); it.hasNext();)
		{
			surveyResponse = (SurveyResponse)it.next();
			if (!(surveyResponse.getTargetId().equals(targetId)))
			{
				//하나라도 target_id 가 다르면 안됨
				return false;
			}
			if (surveyResponse.getProcessSeq() != processSeq)
			{
				return false;
			}
			surveyResponse.setCreatedDate(createdDate);
		}
		
		//3. 응답이 이미 있으면? -> TODO : 응답이 있다는 오류를 리턴해야 함.
		try
        {
            Integer iRet = (Integer) sqlMap.queryForObject("Survey.selectCountByTargetIdAndSurveyId", surveyResponse);
            if (iRet.intValue() > 0) return false;
            //4. TODO : 필수 입력항목 체크해야 함.   
        }
        catch (SQLException e)
        {
            logger.error(e.getMessage());
        }
        
        //4. 필요한 데이터들을 넣는다.
        try
        {
        	KbViewLog kbViewLog = null;
        	KbSearchLog kbSearchLog = null;
        	if (surveyType.equals(EEPublic.SURVEY_TYPE_FAQ_AFTER))
			{
				//viewlog 에서 필요한 정보를 가져온다.
				kbViewLog = (KbViewLog) sqlMap.queryForObject("Survey.selectViewLogByLogId", targetId);
				if (kbViewLog == null)
				{
					return false;
				}
			}
        	else if (surveyType.equals(EEPublic.SURVEY_TYPE_SEARCH_AFTER))
			{
				//viewlog 에서 필요한 정보를 가져온다.
        		kbSearchLog = (KbSearchLog) sqlMap.queryForObject("Survey.selectSearchLogByLogId", targetId);
				if (kbSearchLog == null)
				{
					return false;
				}
			}
        	
        	int[] arrResponseId =new int[iResponseCount];
        	int i = 0;
        	String responseValue = null;
        	String codeId = null;
        	String codeValue = null;
        	
        	String strCustomerId = null;
            String strCustomerEmail = null;
            String strCustomerName = null;
            String strCustomerTel = null;
            String strCustomerNo = null;
            
            boolean isExistOption = false;
            boolean isExistCustInfo = false;
            Option option = new Option();
            option.setTargetId(targetId);
            
        	//트랜잭션 시작
        	sqlMap.startTransaction();
        	for (Iterator it = surveyResponseList.iterator(); it.hasNext();)
    		{
        		surveyResponse = (SurveyResponse)it.next();
        		responseValue = surveyResponse.getResponseValue();
        		String[] arrResponseValue = responseValue.split(":", 2);
        		codeId = arrResponseValue[0];
        		codeValue = arrResponseValue[1];
        		
        		//t_survey_response 에 insert 한후
        		surveyResponse.setResponseValue(codeId);
        		Integer returnValue = (Integer)sqlMap.insert("Survey.insertSurveyResponseAndGetId", surveyResponse);
        		arrResponseId[i++] = returnValue.intValue();
        		//codesetId 값으로 부터 추가적인 처리를 한다. CSET0000000001 ~ CSET0000000039 까지는 미리 정의 되어 있다.
        		//본래는 t_codeset 테이블의 codeset_type 으로 구분되어 있지만, db select 를 줄이기 위해 codeset_id 로 코딩한다.
        		/*
        		 CSET0000000001	시스템만족도	TYFDK
        		 CSET0000000002	추가정보01	TYP01
        		 CSET0000000003	추가정보02	TYP02
        		 ...
        		 CSET0000000031	추가정보30	TYP30
        		 
        		 CSET0000000032	고객아이디	TYCID
        		 CSET0000000033	고객이메일	TYEML
        		 CSET0000000034	고객이름		TYNAM
        		 CSET0000000035	고객연락처	TYTEL
        		 CSET0000000036	고객식별번호	TYNUM
        		 CSET0000000037	고객 대화명	TYNIC
        		 CSET0000000038	접속경로		TYUSR
        		 CSET0000000039	이름			TYUSR
        		*/
        		if (surveyResponse.getCodesetId().equals("CSET0000000001"))
        		{
	        		if (serviceType.equals(EEPublic.SERVICE_TYPE_FAQ) || serviceType.equals(EEPublic.SERVICE_TYPE_KB))
	        		{
	        			if (surveyType.equals(EEPublic.SURVEY_TYPE_FAQ_AFTER))
	        			{
	        				Kb kb = new Kb();
		        			/**
		                  	 * t_kb_detail.total_feedback
		                  	 * t_kb_detail.feedback_count
		                  	 */
	        				kb.setServiceType(kbViewLog.getServiceType());
	        				kb.setKbId(kbViewLog.getKbId());
	        				kb.setTotalFeedback(Integer.parseInt(codeValue));
	        				
		        			int iResult = sqlMap.update("Survey.updateKbDetail", kb);
		        			/**
		                  	 * 1. 조회 로그
		                  	 * t_kb_view_log.feedback
		                  	 * t_kb_view_log.feedback_code_id
		                  	 */
		        			Kb kbLog = new Kb();
		        			kbLog.setLogId(surveyResponse.getTargetId());
		        			kbLog.setFeedback(Integer.parseInt(codeValue));
		        			kbLog.setFeedbackCodeId(codeId);
		        			
		        			iResult = sqlMap.update("Survey.updateKbViewLog", kbLog);
	        			}
	        			else if (surveyType.equals(EEPublic.SURVEY_TYPE_SEARCH_AFTER))
	        			{
	        				/**
	                     	 * 2. 검색 로그
	                     	 * t_kb_search_log.feedback
	                     	 * t_kb_search_log.feedback_code_id
	                     	 */
	        				Kb kbLog = new Kb();
	        				kbLog.setLogId(surveyResponse.getTargetId());
	        				kbLog.setFeedback(Integer.parseInt(codeValue));
	        				kbLog.setFeedbackCodeId(codeId);
	        				int iResult = sqlMap.update("Survey.updateKbSearchLog", kbLog);
	        			}
	        		}
	        		else if (serviceType.equals(EEPublic.SERVICE_TYPE_QNA))
	        		{
	        			//updateQnaFeedback(strTargetId, iProcessSeq, iFeedback, strCodeId);
	        		}
        		}
        		else if (StringUtil.isGreaterThanEqual(surveyResponse.getCodesetId(), "CSET0000000002") &&
        				StringUtil.isLessThanEqual(surveyResponse.getCodesetId(), "CSET0000000031"))
        		{
        			isExistOption = true;
        			int optionNo = Util.str2i(
                            StringUtil.substring(surveyResponse.getCodesetId(), surveyResponse.getCodesetId().length()-2), 0
                            ); 
        			option.setOption(optionNo, codeValue);
        			//추가정보 option01 ~ option30
        			if (serviceType.equals(EEPublic.SERVICE_TYPE_QNA))
        			{
        				option.setTargetTable("t_qna_option");
        				option.setTargetKey("qna_id");
        			}
        			else if (serviceType.equals(EEPublic.SERVICE_TYPE_CHAT))
        			{
        				option.setTargetTable("t_chat_option");
        				option.setTargetKey("chat_id");
        			}
        			else if (serviceType.equals(EEPublic.SERVICE_TYPE_TALK))
        			{
        				option.setTargetTable("t_talk_option");
        				option.setTargetKey("talk_id");
        			}
        		}
        		//고객정보
        		else if (surveyResponse.getCodesetId().equals("CSET0000000032"))
        		{
        			isExistCustInfo = true;
        			strCustomerId = codeValue;
        		}
        		else if (surveyResponse.getCodesetId().equals("CSET0000000032"))
        		{
        			isExistCustInfo = true;
        			strCustomerEmail = codeValue;
        		}
        		else if (surveyResponse.getCodesetId().equals("CSET0000000032"))
        		{
        			isExistCustInfo = true;
        			strCustomerName = codeValue;
        		}
        		else if (surveyResponse.getCodesetId().equals("CSET0000000032"))
        		{
        			isExistCustInfo = true;
        			strCustomerTel = codeValue;
        		}
        		else if (surveyResponse.getCodesetId().equals("CSET0000000032"))
        		{
        			isExistCustInfo = true;
        			strCustomerNo = codeValue;
        		}
    		}
        	//업데이트할 옵션 정보가 있으면 업데이트 함 - 테스트 안됐음.
        	if (isExistOption)
        	{
        		boolean bSuccessOption = insertOrUpdateOption(option);
        	}
        	if(isExistCustInfo)
        	{
        		//updateCustomerInfo(targetId, strCustomerId, strCustomerEmail, strCustomerName, strCustomerTel, strCustomerNo);
        	}
            //codeset_type 에 따라 처리
            sqlMap.commitTransaction();
            
        }
        catch(Exception e)
        {
            logger.error(e.getMessage());
            e.printStackTrace();
        }
        finally
        {
            try
            {
                sqlMap.endTransaction();
            }
            catch(SQLException e)
            {
                logger.error(e.getMessage());
                e.printStackTrace();
            }
        }
        
		return true;
    }
	
	/**
	 * 설문지에 해당하는 모든 응답 결과를 기록한다.
	 * 요청은 하나의 설문지(target_id) 에서 들어온것으로 가정한다.
	 * target_id 가 서로 다른 경우는 에러
	 * 
	 * @param SurveyResponseListForm
	 * @return
	 */
	public String insertSurveyResponseFormList(ArrayList surveyResponseList)
    {
		String strResult = "false";
		boolean bSuccess = false;
		
		// 간단한 데이터 검증
    	// 1. 입력할 데이터가 없다.
		if (surveyResponseList == null || surveyResponseList.size() == 0) return strResult;
		
		SurveyResponseForm surveyResponse = (SurveyResponseForm)surveyResponseList.get(0);
		
		String createdDate = DateUtil.getCurrDateTimeStamp();
		String strTargetId = surveyResponse.getTargetId();
		int iProcessSeq = surveyResponse.getProcessSeq();
	
		// 2. target_id 는 모두 같아야함. => 하나라도 target_id 가 다르면 안됨.
		for (Iterator it = surveyResponseList.iterator(); it.hasNext();)
		{
			surveyResponse = (SurveyResponseForm)it.next();
			if (!(surveyResponse.getTargetId().equals(strTargetId)))
			{
				return strResult;
			}
			if (surveyResponse.getProcessSeq() != iProcessSeq)
			{
				return strResult;
			}
			surveyResponse.setCreatedDate(createdDate);
		}
		
		// 3. 설문 응답이 있는지 체크
		try
	    {
	        Integer iRet = (Integer) sqlMap.queryForObject("Survey.selectCountByTargetIdAndSurveyId", surveyResponse);
	        if (iRet.intValue() > 0)
	        {
	        	strResult = "exist";
	        	
	        	return strResult;
	        }
	    }
	    catch (SQLException e)
	    {
	        logger.error(e.getMessage());
	    }
	    
	    // 4. 필요한 데이터들을 넣는다.
	    try
	    {
	    	String strServiceType = surveyResponse.getServiceType();
			String strSurveyType = surveyResponse.getSurveyType();
			String strAnswerType = "";
			String strInputType = "";
			String strCodeInfo = "";
		    String strCodeValue = "";
		    String strCodeId = "";
		    String strReportCode = "";
		    String strCodeName = "";
		    String strCodeList = "";
			String strMappingId  = "";
		    String strMappingType = "";
		    String strTargetTable = "";
		    String strTargetField = "";
		    String strCodesetId = "";
		    String strCodesetType = "";
			String strResponseValue = "";
			
			// Qna 고객 상담후 설문 처리를 위해서 필요.
			String strCustomerId = "";
	        String strCustomerEmail = "";
	        String strCustomerName = "";
	        String strCustomerTel = "";
	        String strCustomerNo = "";
	        
	        Option option = new Option();
	        option.setTargetId(strTargetId);
	        boolean isExistOption = false;
	        boolean isExistCustInfo = false;
			
	    	KbViewLog kbViewLog = null;
	    	KbSearchLog kbSearchLog = null;
	    	if(EEPublic.SURVEY_TYPE_FAQ_AFTER.equals(strSurveyType))
			{
				// FAQAF : view log 에서 필요한 정보를 가져온다.
				kbViewLog = (KbViewLog) sqlMap.queryForObject("Survey.selectViewLogByLogId", strTargetId);
				if (kbViewLog == null)
				{
					return strResult;
				}
			}
	    	else if(EEPublic.SURVEY_TYPE_SEARCH_AFTER.equals(strSurveyType))
			{
				// SCHAF : search log 에서 필요한 정보를 가져온다.
	    		kbSearchLog = (KbSearchLog) sqlMap.queryForObject("Survey.selectSearchLogByLogId", strTargetId);
				if (kbSearchLog == null)
				{
					return strResult;
				}
			}
	    	
        	// 트랜잭션 시작
        	sqlMap.startTransaction();
        	bSuccess = true;
        	for (Iterator it = surveyResponseList.iterator(); it.hasNext();)
    		{
        		surveyResponse = (SurveyResponseForm)it.next();
        		
        		surveyResponse.setCreatedDate(createdDate);
        		
        		strResponseValue = surveyResponse.getResponseValue();
        		if (StringUtil.isEmpty(strResponseValue))
                {            	
                	continue;
                }
        		
        		strAnswerType = surveyResponse.getAnswerType();
        		strInputType = surveyResponse.getInputType();
        		strMappingId = surveyResponse.getMappingId();
        		strMappingType = surveyResponse.getMappingType();
        		strTargetTable = surveyResponse.getTargetTable();
        		strTargetField = surveyResponse.getTargestField();
        		strCodesetId = surveyResponse.getCodesetId();
        		strCodesetType = surveyResponse.getCodesetType();
        		
        		if("CODES".equals(strInputType) || "CREPT".equals(strInputType) || "CVALE".equals(strInputType))
              	{
                  	strCodeInfo = StringUtil.defaultString(strResponseValue.trim());
                  	String[] arrCodeList = StringUtil.split(strCodeInfo,",",false);
                  	for (int j=0; j < arrCodeList.length; j++)
    				{
    					String[] arrCodeInfo = null;
    					if (!"undefined".equals(arrCodeList[j]))
    					{
                            //text, textarea 타입 추가됨
                            if (strAnswerType.equals("TEXTS") || strAnswerType.equals("TEXTA"))
                            {
                                strCodeList = arrCodeList[j];
                            }
                            else if (strAnswerType.equals("CHECK"))
                            {
                                arrCodeInfo = StringUtil.split(arrCodeList[j],";",true);
                                if( j > 0 )
                                {
                                    strCodeList += ",";
                                    strCodeId += ",";
                                    strCodeValue += ",";
                                    strReportCode += ",";
                                    strCodeName += ",";                                
                                }
                                
                                strCodeValue += arrCodeInfo[0];
                                strCodeId += arrCodeInfo[1];
                                // strReportCode와 strCodeList는 동일한 값임.
                                strReportCode += arrCodeInfo[2];
                                strCodeList += arrCodeInfo[2];
                                strCodeName += arrCodeInfo[3];
                            }
                            else
                            {
                                arrCodeInfo = StringUtil.split(arrCodeList[j],";",true);
                                strCodeValue =  arrCodeInfo[0];
                                strCodeId =  arrCodeInfo[1];
                                strReportCode = arrCodeInfo[2];
                                strCodeName = arrCodeInfo[3];
                                strCodeList = strReportCode;
                            }
    					}
    				}
                    surveyResponse.setResponseValue(strCodeList);
    			}
              	else
              	{
              		surveyResponse.setResponseValue(StringUtil.defaultString(strResponseValue.trim()));
              	}
        		
        		// t_survey_response 에 insert
        		Integer returnValue = null;
        		if(!"undefined".equals(strResponseValue) && !"".equals(strResponseValue))
              	{
        			returnValue = (Integer)sqlMap.insert("Survey.insertSurveyResponseAndGetId", surveyResponse);
              	}
        		else
              	{
              		continue;
              	}
        		
        		/**
        		 * 설문이 시스템 기본 만족도 코드라면...
                 * 서비스 타입에 따라 각각 Insert 함.
                 * KB  조회만족도 = > t_kb_view_log ( feedback ) 서비스 타입 = > SVKNW OR SVFAQ
                 * KB  검색만족도 = > t_kb_view_log ( feedback ) 서비스 타입 = > SVKNW OR SVFAQ
                 * QNA 만족도    = > t_qna_process ( feedback ) 서비스 타입 = > SVQNA
        		 */
    			/* 설문이 코드라면  */
    			if("CODES".equals(strInputType) || "CREPT".equals(strInputType) || "CVALE".equals(strInputType))
              	{
    				/**
                     * 설문이 시스템 만족도라면 만족도 코드셋 ID = > "CSET0000000001"
                     * 해당 코드 Id (FEEDBACK_CODE_ID) 와 코드 Value(FEEDBACK) 값을 Insert 한다.
                     * Type 이 코드 일 경우 response_value 에는 CodeValue 와 CodeId, reportCode 를 "," 로 구분하여 가지고 있음.
                     * 시스템 코드(만족도)의 경우는 미리 정의된 필드에 값을 넣습니다.
                     */
    				if("CSET0000000001".equals(strCodesetId))
                	{
                		/* KB 만족도 */            		
                    	if("SVFAQ".equals(strServiceType) || "SVKNW".equals(strServiceType))
                		{
    						if(EEPublic.SURVEY_TYPE_FAQ_AFTER.equals(strSurveyType))
                        	{
    							/**
    		                  	 * t_kb_detail.total_feedback
    		                  	 * t_kb_detail.feedback_count
    		                  	 */
    							Kb kb = new Kb();
    	        				kb.setServiceType(kbViewLog.getServiceType());
    	        				kb.setKbId(kbViewLog.getKbId());
    	        				kb.setTotalFeedback(Integer.parseInt(strCodeValue));
    		        			sqlMap.update("Survey.updateKbDetail", kb);
    		        			
    		        			/**
    		                  	 * 조회 로그
    		                  	 * t_kb_view_log.feedback
    		                  	 * t_kb_view_log.feedback_code_id
    		                  	 */
    		        			Kb kbLog = new Kb();
    		        			kbLog.setLogId(surveyResponse.getTargetId());
    		        			kbLog.setFeedback(Integer.parseInt(strCodeValue));
    		        			kbLog.setFeedbackCodeId(strCodeId);
    		        			sqlMap.update("Survey.updateKbViewLog", kbLog);
                        	}
    						else if(EEPublic.SURVEY_TYPE_SEARCH_AFTER.equals(strSurveyType))
                        	{
    							/**
    	                     	 * 검색 로그
    	                     	 * t_kb_search_log.feedback
    	                     	 * t_kb_search_log.feedback_code_id
    	                     	 */
    	        				Kb kbLog = new Kb();
    	        				kbLog.setLogId(surveyResponse.getTargetId());
    	        				kbLog.setFeedback(Integer.parseInt(strCodeValue));
    	        				kbLog.setFeedbackCodeId(strCodeId);
    	        				sqlMap.update("Survey.updateKbSearchLog", kbLog);
                        	}
                        }
                        /* Qna 만족도 */
                        else if(EEPublic.SERVICE_TYPE_QNA.equals(strServiceType)&&("CSET0000000001".equals(strCodesetId)))
                        {
                    		/**
                         	 * t_qna.total_feedback 입력
                         	 * t_qna.feedback_count 입력
                         	 * t_qna_perocess.feedback_code_id 입력
                         	 * t_qna_perocess.feedback 입력
                         	 * t_qna_perocess.feedback_date 입력
                         	 */
    	                    int iFeedback = -1;
    	                    try
    	                    {
    	                        iFeedback = Integer.parseInt(strCodeValue);
    	                    }
    	                    catch(Exception e) {}
    	                    
    	                    Qna qna = new Qna();
    	                    qna.setTotalFeedback(iFeedback);
    	                    qna.setQnaId(strTargetId);

    	                    QnaProcess qnaProcess = new QnaProcess();
    	                    qnaProcess.setFeedback(iFeedback);
    	                    qnaProcess.setFeedbackDate(createdDate);
    	                    qnaProcess.setFeedbackCodeId(strCodeId);
    	                    qnaProcess.setQnaId(strTargetId);
    	                    qnaProcess.setProcessSeq(iProcessSeq);
    	                    
    	                    sqlMap.update("Survey.updateQnaFeedback", qna);
    	                    sqlMap.update("Survey.updateQnaProcessFeedback", qnaProcess);
                        }
                    }
                }
        		
    			/* 설문 타입이 매핑이면 (매핑 정보가 있다면) >>>매핑아이디가 MAPPINGNOTHING가 아니면 맵핑사용하는것.*/
                strResponseValue = StringUtil.defaultString(strResponseValue);
                if (bSuccess && !"undefined".equals(strResponseValue))
                {
                    if(EEPublic.SERVICE_TYPE_FAQ.equals(strServiceType) || EEPublic.SERVICE_TYPE_KB.equals(strServiceType))
                    {
                        if(!"MAPPINGNOTHING".equals(strMappingId))
                        {
                        	SurveyResponse obj = new SurveyResponse();
                            obj.setMappingType(strMappingType);
                            obj.setTargetTable(strTargetTable);
                            obj.setTargetField(strTargetField);
                            obj.setResponseValue(strResponseValue);
                            obj.setCreatedDate(createdDate);
                            obj.setTargetId(strTargetId);
                            
                            sqlMap.update("Survey.updateMappingInfo", obj);
                        }
                    }
                    else
                    {
                        //고객정보는 t_qna 에 update
                        if (StringUtil.equals(strCodesetType, "TYCID"))
                        {
                            strCustomerId = strCodeList;
                            isExistCustInfo = true;
                        }
                        else if (StringUtil.equals(strCodesetType, "TYEML"))
                        {
                            strCustomerEmail = strCodeList;
                            isExistCustInfo = true;
                        }
                        else if (StringUtil.equals(strCodesetType, "TYNAM"))
                        {
                            strCustomerName = strCodeList;
                            isExistCustInfo = true;
                        }
                        else if (StringUtil.equals(strCodesetType, "TYTEL"))
                        {
                            strCustomerTel = strCodeList;
                            isExistCustInfo = true;
                        }
                        else if (StringUtil.equals(strCodesetType, "TYNUM"))
                        {
                            strCustomerNo = strCodeList;
                            isExistCustInfo = true;
                        }
                        
                        if(!"MAPPINGNOTHING".equals(strMappingId))
                        {                        
                            if (strCodesetType.startsWith("TYP"))
                            {
                                option.setTargetTable(strTargetTable);
                                
                                int optionNo = Util.str2i(
                                        StringUtil.substring(strCodesetType, strCodesetType.length()-2), 0
                                        ); 
                                
                                //값은 code_name 또는 텍스트 타입인 경우는 입력값
                                if (strAnswerType.equals("TEXTS") || strAnswerType.equals("TEXTA"))
                                {
                                    option.setOption(optionNo, strResponseValue);
                                }
                                else
                                {
                                    //input_type 에 따라 다른값을 넣는다.
                                    if (StringUtil.equals(strInputType, "CODES"))
                                    {
                                        option.setOption(optionNo, strCodeName);
                                    }
                                    else if (StringUtil.equals(strInputType, "CREPT"))
                                    {
                                        option.setOption(optionNo, strReportCode);
                                    }
                                    else if (StringUtil.equals(strInputType, "CVALE")) 
                                    {
                                        option.setOption(optionNo, strCodeValue);
                                    }
                                }
                                isExistOption = true;
                            }
                        }
                    }
                }
    		}
        	
        	if(bSuccess && EEPublic.SERVICE_TYPE_QNA.equals(strServiceType))
            {
                //QnA 고객정보 업데이트
                if( isExistCustInfo )
                {
                	Qna qna = new Qna();
                    qna.setQnaId(strTargetId);
                    qna.setCustomerId(strCustomerId);
                    qna.setCustomerEmail(strCustomerEmail);
                    qna.setCustomerName(strCustomerName);
                    qna.setCustomerTel(strCustomerTel);
                    qna.setCustomerNo(strCustomerNo);
                    
                    sqlMap.update("Qna.updateCustomerInfo", qna);
                }
                
                // 옵션정보 업데이트
                if (isExistOption) 
                {
                    option.setTargetKey("qna_id");
                    
                    sqlMap.insert("Survey.insertOptionQuery", option);
                }
            }
            sqlMap.commitTransaction();
            
        }
        catch(Exception e)
        {
        	bSuccess = false;
            logger.error(e.getMessage());
            e.printStackTrace();
        }
        finally
        {
            try
            {
                sqlMap.endTransaction();
            }
            catch(SQLException e)
            {
            	bSuccess = false;
                logger.error(e.getMessage());
                e.printStackTrace();
            }
        }
        
        if(bSuccess)
        {
        	strResult = "true";
        }
        
		return strResult;
    }
}
